﻿using System;

using Geometria;
using Geometria.Angulos;

namespace Asteroids.Physics
{
    public class Nave : Objeto
    {
        #region Fields

        private double aceleracion;
        private System.DateTime ultimoMisil;
        private System.DateTime ultimoProjectil;

        #endregion Fields

        #region Constructors

        /// <summary>
        /// 
        /// </summary>
        public Nave()
            : base(new Punto(0, 0, 0), new AnguloCompuesto(), new Vector(0, 0, 0))
        {
            this.aceleracion = 0.1;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="posicionInicial"></param>
        /// <param name="angulo"></param>
        /// <param name="velocidadInicial"></param>
        public Nave(Punto posicionInicial, AnguloCompuesto angulo, Vector velocidadInicial)
            : base(posicionInicial, angulo, velocidadInicial)
        {
            this.aceleracion = 0.1;
        }

        #endregion Constructors

        #region Properties

        /// <summary>
        /// 
        /// </summary>
        public double Aceleracion
        {
            get { return aceleracion; }
            set { aceleracion = value; }
        }

        /// <summary>
        /// 
        /// </summary>
        public System.DateTime UltimoMisil
        {
            get { return ultimoMisil; }
            private set { ultimoMisil = value; }
        }

        /// <summary>
        /// 
        /// </summary>
        public System.DateTime UltimoProjectil
        {
            get { return ultimoProjectil; }
            private set { ultimoProjectil = value; }
        }

        #endregion Properties

        #region Methods

        /// <summary>
        /// 
        /// </summary>
        public void Acelerar()
        {
            Vector diferencial;

            diferencial = this.Angulo.GenerarVector(this.Aceleracion) / IteracionesPorSegundo;

            ModificarVelocidad(diferencial);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public Misil DispararMisil()
        {
            DateTime t = this.UltimoMisil + Misil.Diferencia;
            Misil m;

            if (DateTime.Now >= t)
            {
                Punto posicionInicial;
                Vector velocidadInicial;

                posicionInicial = this.Posicion;
                velocidadInicial = this.Angulo.GenerarVector(10.0);

                m = new Misil(posicionInicial, this.Angulo, velocidadInicial);

                //Registra el momento del último disparo
                this.ultimoMisil = DateTime.Now;

                //retornar el proyectil
                return m;
            }
            else
            {
                return null;
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public Projectil DispararProyectil()
        {
            DateTime t = this.UltimoProjectil + Projectil.Diferencia;
            Projectil p;

            if (DateTime.Now >= t)
            {
                Punto posicionInicial;
                Vector velocidadInicial;

                posicionInicial = this.Posicion;
                velocidadInicial = this.Angulo.GenerarVector(10.0);

                p = new Projectil(posicionInicial, this.Angulo, velocidadInicial);

                //Registra el momento del último disparo
                this.ultimoProjectil = DateTime.Now;

                //retornar el proyectil
                return p;
            }
            else
            {
                return null;
            }
        }

        #endregion Methods
    }
}